package cn.xscrum.vtsp.controller;

import cn.xscrum.common.core.controller.BaseController;
import cn.xscrum.vtsp.service.IVtspVisualService;
import cn.xscrum.vtsp.service.IVtspVolunteerStatisticService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

/**
 * 志愿者统计分析Controller
 *
 * @author wfs
 * @date 2021-10-05
 */

@Controller
@RequestMapping(value = "/vtsp/statistic/volunteerstatistic")
public class VtspVolunteerStatisticController extends BaseController
{

    //访回路径前缀
    private String prefix = "vtsp/statistic/volunteerstatistic";

    @Autowired
    private IVtspVolunteerStatisticService volunteerStatisticService;

    @Autowired
    private IVtspVisualService visualService;

    /**
     * 请求地址为/vtsp/statistic/volunteerstatistic时跳转至/vtsp/statistic/volunteerstatistic/volunteerStatistic.html
     *
     * @return volunteerStatistic视图名
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping()
    public String volunteerStatistic()
    {
        return prefix + "/volunteerStatistic";
    }


    /**
     * 志愿者所在学院分布
     *
     * @return  各个学院及其对应志愿者人数的集合
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping("/getVolunteerCollegeDistribution")
    @ResponseBody
    public List<Map<String, Object>> getVolunteerCollegeDistribution()
    {
        return volunteerStatisticService.getVolunteerCollegeDistribution();
    }


    /**
     * 志愿者所在地区分布
     *
     * @return  各个地区及其对应志愿者人数的集合
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping("/getVolunteerLocalDistribution")
    @ResponseBody
    public List<Map<String, Object>> getVolunteerLocalDistribution()
    {
        //localList用于存储各个国家id及其对应的志愿者人数
        List<Map<String,Object>> localList = volunteerStatisticService.getVolunteerLocalDistribution();

        //countryList用于存储各个国家及其对应的志愿者人数
        List<Map<String,Object>> countryList = new ArrayList<>();


        for (int i=0;i<localList.size();i++)
        {
            //map用于存储一个国家的名称及其对应的志愿者人数
            Map<String, Object> map = new HashMap<String, Object>();
            //将国家id强制转换为整数类型
            Integer areasId = Integer.parseInt(String.valueOf(localList.get(i).get("areasId")));

            //将国家名称和志愿者人数添加到map中
            map.put("name",volunteerStatisticService.getCountryName(areasId));
            map.put("value",localList.get(i).get("value"));

            //将map添加到countryList中
            countryList.add(map);
        }

        return countryList;
    }


    /**
     * 志愿者学历分布情况
     *
     * @return  各个学历等级及其对应的志愿者人数的集合
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping("/getVolunteerDegreeDistribution")
    @ResponseBody
    public List<Integer> getVolunteerDegreeDistribution()
    {
        //numberList用于存储各个学历的志愿者人数，默认为0，分别对应（博士研究生，硕士研究生、本科生）
        List<Integer> numberList = Arrays.asList(0,0,0);

        //获取志愿者各个学历及其对应的人数的集合
        List<Map<String,Object>> volunteerDegreeList = volunteerStatisticService.getVolunteerDegreeDistribution();

        //volunteerDegreeIndex表示在numberList列表中的位置，也就是数据库中存储对应活动状态的标识，
        //temp：用于numberList进行首尾对调，因前端中是（博士研究生，硕士研究生、本科生）排列，所以对numberList赋值完后需对调首位数值
        //volunteerDegreeNumber表示对用活动状态的活动数，将Object强制转换为int
        Integer volunteerDegreeIndex,volunteerDegreeNumber,temp;

        //循环activityStatusList将对应状态的活动数添加到activityNumberList中
        for (int i=0;i<volunteerDegreeList.size();i++)
        {

            //因为获取的是一个Object类型的数据不能直接转换为int类型，所以需将其转换为String类型，再将String类型转换为int类型
            volunteerDegreeIndex = Integer.parseInt(String.valueOf(volunteerDegreeList.get(i).get("degree")));

            volunteerDegreeNumber = Integer.parseInt(String.valueOf(volunteerDegreeList.get(i).get("number")));

            //将对应活动状态的活动数添加到activityNumberList中,在数据库中的学历值从1开始，所以需减1才能对应下标
            numberList.set(volunteerDegreeIndex-1, volunteerDegreeNumber);
        }

        temp = numberList.get(0);
        numberList.set(0,numberList.get(2));
        numberList.set(2,temp);


        return numberList;
    }


    /**
     * 每年志愿者增加的人数
     *
     * @return  各个年份志愿者增加人数的集合
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping("/getVolunteerGrowthTrend")
    @ResponseBody
    public List<Map<String, Object>> getVolunteerGrowthTrend()
    {
        return volunteerStatisticService.getVolunteerGrowthTrend();
    }


    /**
     * 各个年龄段志愿者分布情况
     *
     * @return  各个年龄段及其对应的志愿者人数的集合
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping("/getVolunteerAgeDistribution")
    @ResponseBody
    public List<Map<String, Object>> getVolunteerAgeDistribution()
    {
        return visualService.getVolunteerAgeVisual();
    }


    /**
     * 获取志愿者各个状态的人数（应届生、往届生、黑名单）
     * 
     * @return 志愿者各个状态人数的集合（应届生、往届生、黑名单）
     */
    @RequiresPermissions("vtsp:statistic:volunteerstatistic:view")
    @GetMapping("/getVolunteerStatusDistribution")
    @ResponseBody
    public List<Integer> getVolunteerStatusDistribution()
    {
        // 用于存储各个志愿者状态人数，并发送至前端
        List<Integer> numberList = Arrays.asList(0 ,0 ,0);
        //用户存储志愿者黑名单人数
        Integer blacklist = volunteerStatisticService.getBlacklist();

        //volunteerStateList用于存储（应届生、往届生）的数据库表示以及人数
        List<Map<String,Object>> volunteerStateList = volunteerStatisticService.getAllPreviousBirthDistribution();

        //volunteerStateIndex表示在numberList列表中的下标，也就是数据库中存储对应活动状态的标识
        //volunteerSateNumber表示对用活动状态的活动数，将Object强制转换为int
        Integer volunteerStateIndex,volunteerSateNumber;

        //循环activityStatusList将对应状态的活动数添加到activityNumberList中
        for (int i=0;i<volunteerStateList.size();i++)
        {

            //因为获取的是一个Object类型的数据不能直接转换为int类型，所以需将其转换为String类型，再将String类型转换为int类型
            volunteerStateIndex = Integer.parseInt(String.valueOf(volunteerStateList.get(i).get("state")));

            volunteerSateNumber = Integer.parseInt(String.valueOf(volunteerStateList.get(i).get("number")));

            //将对应活动状态的活动数添加到activityNumberList中
            numberList.set(volunteerStateIndex, volunteerSateNumber);
        }

        //将黑名单人数添加到列表末尾
        numberList.set(2, blacklist);

        return numberList;

    }

}
